학습목표

  1. beautifulsoup 모듈 사용하기
  2. id, class 속성으로 tag 찾기
  3. CSS를 이용하여 tag 찾기
  4. 속성 값으로 tag 찾기
  5. 정규표현식으로 tag 찾기
  6. 개발자도구를 이용하여 동적으로 로딩되는 데이터 추출하기
In [1]:
import requests
from bs4 import BeautifulSoup

다음 뉴스 데이터 추출

  • 뉴스기사에서 제목, 작성자, 작성일 , 댓글 개수 추출
  • 뉴스링크
  • tag를 추출할때는 가장 그 tag를 쉽게 특정할 수 있는 속성을 사용
    • id의 경우 원칙적으로 한 html 문서 내에서 유일

CSS 선택자

  • 태그 : 태그이름
  • id : #id (여기) => #abc
  • class : .class (여기) => .abc
  • 자식 : 직계만
  • 자손 : 하위테그 전체
  • id, class 속성으로 tag 찾기
    • 타이틀
    • 작성자, 작성일
In [2]:
url = 'https://news.v.daum.net/v/20190728165812603'
resp = requests.get(url)
resp.status_code
Out[2]:
200
In [3]:
soup = BeautifulSoup(resp.text)
title = soup.find('h3', class_='tit_view')
title.get_text()
Out[3]:
'일론머스크 "테슬라에서 넷플릭스·유튜브 즐길 날 온다"'
In [4]:
title = soup.select('h3.tit_view')
print(type(title))
title
<class 'bs4.element.ResultSet'>
Out[4]:
[<h3 class="tit_view" data-translation="true">일론머스크 "테슬라에서 넷플릭스·유튜브 즐길 날 온다"</h3>]
In [5]:
cMain = soup.select("div#cMain")
print(type(cMain))
# cMain
<class 'bs4.element.ResultSet'>
In [6]:
# 자식 테크 선택
soup.select('#harmonyContainer > p')
Out[6]:
[<p data-translation="true">&lt;ⓒ경제를 보는 눈, 세계를 보는 창 아시아경제 무단전재 배포금지&gt;</p>]
In [7]:
# 자손 테크 선택
soup.select('#harmonyContainer p')
Out[7]:
[<p class="link_figure"><img alt="일론 머스크 테슬라 최고경영자(CEO) [이미지출처=로이터연합뉴스]" class="thumb_g_article" data-org-src="https://t1.daumcdn.net/news/201907/28/akn/20190728165813230vjsq.jpg" data-org-width="550" dmcf-mid="NBMY3ZZhN4" dmcf-mtype="image" height="auto" src="https://img4.daumcdn.net/thumb/R658x0.q70/?fname=https://t1.daumcdn.net/news/201907/28/akn/20190728165813230vjsq.jpg" width="658"/></p>,
 <p>[아시아경제 이민우 기자] 일론 머스크 테슬라 최고경영자(CEO)가 자사 전기 자동차 모델에 넷플릭스와 유튜브 등 온라인동영상서비스(OTT)를 탑재할 것이라고 예고했다. 단순히 자율 주행 전기차가 단순히 주행을 위한 정보를 알려주는 것을 넘어 각종 영상 콘텐츠를 즐기는 공간으로도 확장하겠다는 전략으로 풀이된다.</p>,
 <p>27일(현지시간) 더버지 등 주요 외신들에 따르면 머스크 CEO는 자신의 트위터를 통해 이 같은 계획을 밝혔다. 그는 "자동차가 정차했을 때 넷플릭스와 유튜브를 감상할 수 있는 기능이 조만간 추가될 것"이라며 "편안한 좌석과 서라운드 사운드 오디오를 통해 영화관과 같은 느낌을 받을 수 있을 것"이라고 강조했다.</p>,
 <p class="link_figure"><img alt="(출처=일론 머스크 트위터 계정 캡쳐)" class="thumb_g_article" data-org-src="https://t1.daumcdn.net/news/201907/28/akn/20190728165813670hwxf.png" data-org-width="550" dmcf-mid="NRhnb5SRpx" dmcf-mtype="image" height="auto" src="https://img3.daumcdn.net/thumb/R658x0.q70/?fname=https://t1.daumcdn.net/news/201907/28/akn/20190728165813670hwxf.png" width="658"/></p>,
 <p>테슬라가 이처럼 콘텐츠 방면으로 확장하려 든 것은 이번이 처음이 아니다. 지난달 세계 최대 게임쇼 E3에서는 이미 운전자가 '폴아웃 쉘터'라는 게임을 할 수 있을 것이라고 발표한 바 있다. 이후에도 최근 게임업체 아타리사(社)의 자동차 경주 게임 ‘폴포지션’, 슈팅게임 ‘템페스트’, ‘미사일커맨드’ 등 고전 게임을 제공하기도 했다. 운전대로 게임을 조작하는 방식으로, 차가 주차돼 있을 경우에만 즐길 수 있다.</p>,
 <p>이번 영상 콘텐츠는 주행 중에도 감상할 수 있도록 하는 방안을 고려하고 있다. 테슬라 측은 규제당국이 자율주행에 대해 완전히 승인하면 차량이 움직일 때에도 승객이 동영상을 즐길 수 있을 것이라고 설명했다.</p>,
 <p>하지만 아직까지 자율주행차의 안전에 대한 우려는 완전히 걷혀지지 않은 상황이다. 지난 2017년 차량공유 서비스 우버의 자율주행 시범차량이 보행자와 충돌한 사고가 발생한 바 있다. 게다가 당시 시험 운전자는 디즈니의 동영상 스트리밍 서비스인 '훌루'를 이용하고 있던 것으로 밝혀졌다.</p>,
 <p dmcf-pid="NUOWg8Qxyd" dmcf-ptype="general">이민우 기자 letzwin@asiae.co.kr</p>,
 <p data-translation="true">&lt;ⓒ경제를 보는 눈, 세계를 보는 창 아시아경제 무단전재 배포금지&gt;</p>]
  • CSS를 이용하여 tag 찾기
    • select, select_one함수 사용
    • css selector 사용법
      • 태그명 찾기 tag
      • 자손 태그 찾기 - 자손 관계 (tag tag)
      • 자식 태그 찾기 - 다이렉트 자식 관계 (tag > tag)
      • 아이디 찾기 #id
      • 클래스 찾기 .class
      • 속성값 찾기 [name='test']
        • 속성값 prefix 찾기 [name ^='test']
        • 속성값 suffix 찾기 [name $='test']
        • 속성값 substring 찾기 [name *='test]
      • n번째 자식 tag 찾기 :nth-child(n)
In [ ]:
 
In [ ]:
 
In [ ]:
 
In [ ]:
 
In [ ]:
 
In [ ]:
 
  • 정규표현식으로 tag 찾기
In [8]:
import re
In [9]:
soup.find_all(re.compile('h\d'))
Out[9]:
[<h1> <a class="link_daum" href="https://www.daum.net"> <img alt="Daum" class="thumb_g" height="19" src="//t1.daumcdn.net/media/news/news2016/retina/logo_daum.jpg" width="45"/> </a> <a href="//news.daum.net" id="kakaoServiceLogo"><span class="ir_wa">뉴스</span></a> </h1>,
 <h2 class="screen_out">검색</h2>,
 <h2 class="screen_out">뉴스 메인메뉴</h2>,
 <h2 class="screen_out" id="kakaoBody">IT</h2>,
 <h3 class="tit_view" data-translation="true">일론머스크 "테슬라에서 넷플릭스·유튜브 즐길 날 온다"</h3>,
 <h4 class="screen_out">기사 도구 모음</h4>,
 <h3 class="tit_cp">아시아경제 주요 뉴스</h3>,
 <h3 class="txt_newsview">포토&amp;TV</h3>,
 <h3 class="txt_newsview">이 시각 추천뉴스</h3>,
 <h2 class="tit_direct">바로가기</h2>,
 <h2 class="screen_out">서비스 이용정보</h2>]
In [ ]:
 
In [ ]:
 
  • 댓글 개수 추출
    • 댓글의 경우, 최초 로딩시에 전달되지 않음
    • 이 경우는 추가적으로 AJAX로 비동기적 호출을 하여 따로 data 전송을 함
      • 개발자 도구의 network 탭에서 확인(XHR: XmlHTTPRequest)
      • 비동기적 호출: 사이트의 전체가 아닌 일부분만 업데이트 가능하도록 함
In [ ]:
 
In [ ]:
 
In [ ]: